package com.wyh.domain.vo.groupOne.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ResourceTreeBuilder {
    // 允许的类型列表
    private static final List<String> ALLOWED_TYPES = Arrays.asList("organization", "gardenArea", "house", "building", "layer");

    // 递归过滤节点，返回一个新的树
    public static List<MasterDataTreeNode> filterTree(List<MasterDataTreeNode> nodes) {
        List<MasterDataTreeNode> filteredNodes = new ArrayList<>();

        for (MasterDataTreeNode node : nodes) {
            // 如果节点类型在允许列表中
            if (ALLOWED_TYPES.contains(node.getType())) {
                MasterDataTreeNode filteredNode = new MasterDataTreeNode(
                        node.getUnique_id(), node.getId(), node.getName(),
                        node.getType(), node.getParentId(), node.getParentUniqueId(), node.getState(), new ArrayList<>()
                );

                // 递归处理子节点
                List<MasterDataTreeNode> filteredChildren = filterTree(node.getChildren());
                filteredNode.setChildren(filteredChildren);

                filteredNodes.add(filteredNode);
            } else if ("cluster".equals(node.getType()) || "unit".equals(node.getType())) {
                // 如果节点类型为 cluster 或 unit，处理其子节点
                List<MasterDataTreeNode> filteredChildren = filterTree(node.getChildren());
                // 将 cluster 或 unit 的子节点直接附加到其父节点的父节点（building）上
                for (MasterDataTreeNode child : filteredChildren) {
                    child.setParentId(node.getParentId());
                    child.setParentUniqueId(node.getParentUniqueId());
                }
                filteredNodes.addAll(filteredChildren);
            } else {
                // 其他类型的节点保留其子节点并继续递归处理
                List<MasterDataTreeNode> filteredChildren = filterTree(node.getChildren());
                if (!filteredChildren.isEmpty()) {
                    MasterDataTreeNode retainedNode = new MasterDataTreeNode(
                            node.getUnique_id(), node.getId(), node.getName(),
                            node.getType(), node.getParentId(), node.getParentUniqueId(), node.getState(), filteredChildren
                    );
                    filteredNodes.add(retainedNode);
                }
            }
        }

        return filteredNodes;
    }
}
